package test.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component  
@Aspect  
public class MyAspectJ {  
    /** 
     * 声明一个切入点（包括切入点表达式和切入点签名） 
     */  
    @Pointcut("execution(* com.cjm.model..*.*(..))")  
    public void pointcut1(){
    	System.out.println("method is invoke........");
    	
    }  
      
    /** 
     * 声明一个前置通知 
     */  
    @Before("pointcut1()")  
    public void beforeAdvide(JoinPoint point){  
        System.out.println("触发了前置通知！");  
    }  
      
    /** 
     * 声明一个后置通知 
     */  
    @After("pointcut1()")  
    public void afterAdvie(JoinPoint point){  
        System.out.println("触发了后置通知，抛出异常也会被触发！");  
    }  
      
    /** 
     * 声明一个返回后通知 
     */  
    @AfterReturning(pointcut="pointcut1()", returning="ret")  
    public void afterReturningAdvice(JoinPoint point, Object ret){  
        System.out.println("触发了返回后通知，抛出异常时不被触发，返回值为：" + ret);  
    }  
      
    /** 
     * 声明一个异常通知 
     */  
    @AfterThrowing(pointcut="pointcut1()", throwing="throwing")  
    public void afterThrowsAdvice(JoinPoint point, RuntimeException throwing){  
        System.out.println("触发了异常通知，抛出了RuntimeException异常！");  
    }  
      
    /** 
     * 声明一个环绕通知 
     */  
    @Around("pointcut1()")  
    public Object aroundAdvice(ProceedingJoinPoint point)throws Throwable{  
        System.out.println("触发了环绕通知 开始");  
        Object o = point.proceed();  
        System.out.println("触发了环绕通知 结束");  
        return o;  
    }  
}  
